<!DOCTYPE html PUBLIC "-//W3C//DTD html 3.2//EN">
<html>
<head>
    <meta http-equiv="CONTENT-TYPE" content="text/html; charset=utf-8">
    <meta name="author" content="Ignacio Taranto" >

    <style>
        table, thead, tbody, tfoot, tr, th, td {
            font-family:"Liberation Sans";
            margin-left: 6em;
            font-size:small}
        body, h1, h2, h3, div {
            font-family: lucida sans, helvetica, arial, sans-serif;
            margin-left: 2em;}
        p, li, ul, il {
            font-family: lucida sans, helvetica, arial, sans-serif; 
            margin-left: 6em;
            margin-right: 12em;}
        pre {
            background: #eee; 
            border: 1px dashed #889;
            margin-left: 3em; 
            padding: 1ex;}
        dt {
            font-family: monospace;
            font-weight: bold;}
    </style>
    <style type="text/css">.centeredImage{text-align:center;margin-top:0px;margin-bottom:0px;padding:0px;}</style>

    <title>
        OpenCL - INFORME
    </title>
</head>

<body>

<h1><p align="center"> Laboratorio Sistemas Heterogéneos: OpenCL</p></h1>

<h2><p align="center">Materia: Arquitectura de Computadoras</p></h2>

<h2>Integrantes:</h2>
<p> Moine, Joaquín
<br>E-Mail: ​joaquinmoine@gmail.com
<br>
<br>Rossi, Nahuel
<br>E-Mail: nahuelr@live.com
<br>
<br>Taranto, Ignacio
<br>E-Mail: itaranto7@gmail.com
</p>

<h2>Introducción:</h2>
<p>
    Se procedió a implementar los 
    <a href="http://www.famaf.proed.unc.edu.ar/mod/resource/view.php?id=5343">ejercicios</a>
    detallados por la cátedra.
    <br>La temática de los ejercicios pedidos son:
    <ul>
        <li><b>Ejercicio 1:</b> Describir la información del sistema.
        <li><b>Ejercicio 2:</b> Utilizar paralelismo.
        <li><b>Ejercicio 3:</b> Sincronismo local y global sobre rutinas que corren en paralelo.
        <li><b>Ejercicio 4:</b> Manejo de memoria local y global. Sincronismo.
    </ul>
</p>

<h2>Desarrollo y decisiones de diseño:</h2>
<p>
    Con respecto al ejercicio 1 no se presentaron dificultades ni grandes decisiones de diseño, sirvió para
    familiarizarse con OpenCl.
    <br>
    <br>
    En el ejercicio 2 se pedía implementar la multiplicación de matrices NxN en paralelo.
    <br>
    Se decidió extender el problema a matrices A(MxN), B(NxP) ya que no complicaba demasiado el algoritmo. Se
    procedió dividiendo la operación AxB=R de forma que se opere en paralelo, se repartió a cada unidad
    de cálculo U<sub>i,j</sub> el procesamiento del elemento de la matriz R<sub>i,j</sub> que resolviera la
    multiplicación:
    <br>
    <br>
    A<sub>i,k</sub> x B<sub>k,j</sub>
    &forall; 0 < k < filas(A), puesto que filas(A)=columnas(b).
    <br>
    De manera que esta operación sea de O(N) en vez de O(N<sup>2</sup>).
    <br>
    <br>
    Para el ejercicio 3 se pedía que se hagan dos operaciones de suma consecutivas sobre un arreglo
    siguiendo una serie de reglas determinadas.
    <br>
    Se decidió usar barreras para sincronizar las rutinas y garantizar que el acceso a los datos se efectúe después
    de haber sido escritos.
    <br>
    <br>
    En el ejercicio 4 se desea aproximar &pi; con una precisión N dada según la sumatoria:
    <br>
    <br>
    </p>
    <p class="centeredImage"><img src="Informe_imagenes/funcionpi.gif"> </p>
    <br>
    <p>
    Para resolver esta función aprovechando el paralelismo se decidió dividir el problema en
    dos etapas: La primera que se encarga de calcular cada término de la serie
    <img src="Informe_imagenes/line_funcionpi.bmp">
    para 0< i < N y almacena los resultados de cada elemento en un arreglo de tamaño N. Luego
    se utiliza un algoritmo de suma en paralelo que resuelve la suma de todos los elementos del arreglo
    con complejidad log<sub>2</sub>(N).
</p>

<h2>Herramientas utilizadas:</h2>
<p>
<li>OpenCL implementado en NVIDIA CUDA</li>
</p>
<br>

</body>
</html>